package day9_29;

import java.util.*;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/10/28 22:08
 * 泛型
 *  特征 <....>， 一种变化的类型，只用于引用类型，编译前使用
 *          定义泛型
 *          使用泛型
 *
 *          特点：1. 泛型 是 Object[] 类，Object是所有类（包括接口）的祖先类
 *                  上层引用可以指向下层对象
 *                2.java的泛型只在编译阶段起作用
 *                3.只支持引用，不支持基本类型（引入包装类）
 */
public class GenericType {
    static class Cat{
        String name ;
        int age;

        public Cat(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return "Cat{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
//    private static int compare(long e1,long e2){
//        if (e1>e2) {
//            return 1;
//        }else if (e1< e2){
//            return -1;
//        }else {
//            return 0;
//        }
//    }
//    private static void swap(long[] arr,int i,int j){
//        long t =arr[i];
//        arr[i] = arr[j];
//        arr[j] =t;
//    }
//    //定义
//    public static void bubblesSort(long[] arr){
//        for (int i = 0; i < arr.length-1; i++) {
//            for (int j = 0; j < arr.length - i - 1; j++) {
//                long e1 = arr[j];
//                long e2 = arr[j+1];
//                int cmp = compare(e1,e2);
//                if (cmp>0){
//                    swap(arr,j,j+1);
//                }
//            }
//        }
//    }
//    //mao
//    private static int compare(Cat e1,Cat e2){
//        if (e1.age>e2.age) {
//            return 1;
//        }else if (e1.age< e2.age){
//            return -1;
//        }else {
//            return 0;
//        }
//    }
//    private static void swap(Cat[] arr,int i,int j){
//        Cat t =arr[i];
//        arr[i] = arr[j];
//        arr[j] =t;
//    }
//    public static void bubblesSort(Cat[] arr){
//        for (int i = 0; i < arr.length-1; i++) {
//            for (int j = 0; j < arr.length - i - 1; j++) {
//                Cat e1 = arr[j];
//                Cat e2 = arr[j+1];
//                int cmp = compare(e1,e2);
//                if (cmp>0){
//                    swap(arr,j,j+1);
//                }
//            }
//        }
//    }
    //泛型
    //T 是一个变量，类型变量
    public static <T> void bubblesSort(T[] arr){
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                T e1 = arr[j];
                T e2 = arr[j+1];
                int cmp = compare(e1,e2);
                if (cmp>0){
                    swap(arr,j,j+1);
                }
            }
        }
    }
    private static <T> void swap(T[] arr,int i,int j){
        T t =arr[i];
        arr[i] = arr[j];
        arr[j] =t;
    }
    private static <T> int compare(T s1,T s2){
        //TRICK
        Cat e1 = (Cat) s1;
        Cat e2 = (Cat) s2;
        if (e1.age>e2.age) {
            return 1;
        }else if (e1.age< e2.age){
            return -1;
        }else {
            return 0;
        }
    }
    public static void main1(String[] args) {
//        long[] arr = {1,5,12,4,12,41,12311};
        Cat[] arr = {
                new Cat("D",12),
                new Cat("C",2),
                new Cat("B",1),
                new Cat("E",122),
                new Cat("A",0)
        };
        bubblesSort(arr);

        System.out.println(Arrays.toString(arr));
    }
    //使用
    public static void main(String[] args) {
        Iterable<String> iterable = null;
        Collection<String> collection = null;
        List<String> list = null;
        //若是没指定，任意类型放入都可
        List list1 = new ArrayList();
        list1.add(1);
        list1.add("312");
        list1.add(new Random());
        list1.add(new Scanner(System.in));
        //指定类型，就只能放入指定类型的对象
        List<String> list2 = new ArrayList<String>();
        List<String> list3 = new ArrayList<>();//可以省略，编译器自动识别


//        list2.add(1); //Exception
        list2.add("312");
//        list2.add(new Random()); //Exception
//        list2.add(new Scanner(System.in)); //Exception

    }
}
